import time

from django.http import JsonResponse, HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View

from utils.tencent.cos import create_bucket
from web import models
from web.forms.project import ProjectModelForm


class ProjectList(View):
    def get(self,request):
        """查看项目列表"""

        """
        展示项目：
        1、从数据库中获取两部分数据：我创建的项目，我参与的项目
        2、拿到三个列表，一个是前面两个列表，还有一个是前面两个已星标的集合组成的列表
        """
        # 三个列表表示上面说的三个列表
        project_dict = {'star': [], 'my': [], 'join': []}
        # print(request.tracer.user)
        # 查到所有我(当前用户)创建的项目
        my_project_list = models.Project.objects.filter(creator=request.tracer.user)
        for row in my_project_list:
            if row.star:
                project_dict['star'].append({"value": row, 'type': 'my'})
            else:
                project_dict['my'].append(row)
        # 查到所有我加入的项目
        join_project_list = models.ProjectUser.objects.filter(user=request.tracer.user)
        for item in join_project_list:
            if item.star:
                # 构造一下，这样就好取消星标
                project_dict['star'].append({"value": item.project, 'type': 'join'})
            else:
                project_dict['join'].append(item.project)


        form = ProjectModelForm(request)
        return render(request,'project_list.html',{'form':form,'project_dict':project_dict})

    def post(self,request):
        """通过ajax添加项目"""
        form = ProjectModelForm(request,request.POST)
        if form.is_valid():
            # name = form.cleaned_data['name'],不要把项目名拼接进桶名，因为桶名不饿能有中文
            # 1、为项目创建cos存储桶和区域（在utils中封装好的，至少传桶名）
            # 手机号和时间搓来拼接，原因就是桶名和文件名重复都会覆盖，尤其是文件名更要加时间搓
            # bucket = "{}-{}-{}-1300792884".format(name,request.tracer.user.mobile_phone, str(int(time.time())))
            bucket = "{}-{}-1300792884".format(request.tracer.user.mobile_phone, str(int(time.time())))
            region = 'ap-chengdu'
            create_bucket(bucket,region)

            # 2.创建项目(再加上这两个必须字段)
            form.instance.bucket = bucket
            form.instance.region = region
            #用户只提交了三个信息,项目表创建记录有四个必须字段，其余都是有默认值的，还差一个creator字段，我们要添加上
            form.instance.creator = request.tracer.user
            # 创建项目进库
            instance = form.save()

            # 3.项目初始化问题类型
            issues_type_object_list = []
            for item in models.IssuesType.PROJECT_INIT_LIST:  # ["任务", '功能', 'Bug']
                issues_type_object_list.append(models.IssuesType(project=instance, title=item))
            # bulk_create批量增加边表记录
            models.IssuesType.objects.bulk_create(issues_type_object_list)

            return JsonResponse({'status': True})
        return JsonResponse({'status':False,'error':form.errors})


def project_star(request,*args,**kwargs):
    """星标项目操作"""

    # 先拿url中传过来的项目id
    project_id = kwargs.get("project_id")

    if kwargs.get('project_type') == 'my':
        # 更新（必须加creator），不然你都能改别人的了
        models.Project.objects.filter(id=project_id,creator=request.tracer.user).update(star=True)
        ##############################最好用ajax请求
        return redirect(reverse('project_list'))

    if kwargs.get('project_type') == 'join':
        # 同理，这里也要加是修改那个用户的，都是为了防爬虫
        models.Project.objects.filter(project_id=project_id,creator=request.tracer.user).update(star=True)
        ##############################最好用ajax请求
        return redirect(reverse('project_list'))

    return HttpResponse('传参错误，你是爬虫还是猪儿虫？')



def project_unstar(request,*args,**kwargs):
    """取消星标项目操作"""

    # 先拿url中传过来的项目id
    project_id = kwargs.get("project_id")

    if kwargs.get('project_type') == 'my':
        # 更新（必须加creator），不然你都能改别人的了
        models.Project.objects.filter(id=project_id,creator=request.tracer.user).update(star=False)
        ##############################最好用ajax请求
        return redirect(reverse('project_list'))

    if kwargs.get('project_type') == 'join':
        # 同理，这里也要加是修改那个用户的，都是为了防爬虫
        models.Project.objects.filter(project_id=project_id,creator=request.tracer.user).update(star=False)
        ##############################最好用ajax请求
        return redirect(reverse('project_list'))

    return HttpResponse('传参错误，你是爬虫还是猪儿虫？')